package org.codingq92.pritice.socket.group;

import java.net.Socket;

/**
 * 客户端读取线程类，用于接收群聊消息
 * 该类继承了Thread类，通过不断读取Socket的输入流来接收并打印群聊消息
 * 当读取消息出现异常时，表示客户端可能已经退出群聊，此时关闭输入流和Socket连接
 *
 * @author: CodingQ92
 * @date: 2025/6/22 23:19
 */
public class ClientReadThread extends Thread {
    // 保存客户端的Socket连接
    private final Socket socket;

    /**
     * 构造方法，初始化Socket连接
     *
     * @param socket 客户端的Socket连接
     */
    public ClientReadThread(Socket socket) {
        this.socket = socket;
    }

    /**
     * 线程的运行方法
     * 在该方法中，线程会不断尝试读取Socket输入流中的消息，并将其打印到控制台
     * 如果读取消息失败（出现异常），则认为客户端已经退出群聊，此时关闭输入流和Socket连接
     */
    public void run() {
        try {
            // 获取Socket的输入流
            java.io.InputStream inputStream = socket.getInputStream();
            // 创建DataInputStream以便读取数据
            java.io.DataInputStream dataInputStream = new java.io.DataInputStream(inputStream);
            while (true) {
                try {
                    // 读取消息并打印
                    String msg = dataInputStream.readUTF();
                    System.out.println("收到群聊消息: " + msg);
                } catch (Exception e) {
                    // 当读取消息出现异常时，认为客户端已经退出群聊
                    System.out.println("自己退出群聊");
                    // 关闭输入流和Socket连接
                    dataInputStream.close();
                    socket.close();
                    break;
                }
            }
        } catch (Exception e) {
            // 打印异常信息
            e.printStackTrace();
        }
    }
}
